Skip to main content

10 动态链接

重复装载占用内存

多个程序通过装载器装载到内存里面,链接好的同样的功能代码,也都需要再装载一遍,再占一遍内存空间

动态链接,共享内存

动态链接(Dynamic Link):不是存储在硬盘上的目标文件代码,而是加载到内存中的共享库(Shared Libraries)

静态链接(Static Link):合并代码段

Windows 下:.dll 文件,Dynamic-Link Libary(DLL,动态链接库)

Linux 下:.so 文件,Shared Object(动态链接库)

地址无关

地址无关码(Position-Independent Code):编译出来的共享库文件的指令代码是“地址无关”的,无论加载在哪个内存地址,都能够正常执行

地址相关代码:绝对地址代码(Absolute Code)、利用重定位表的代码等

使用相对地址(Relative Address)解决动态代码库内部的变量和函数调用

PLT 和 GOT

程序链接表(PLT,Procedure Link Table)里面找要调用的函数

动态链接对应的共享库时,共享库的 data section 里面保存了一张全局偏移表(GOT,Global Offset Table)。

数据部分是各个动态链接它的应用程序里面各加载一份。所有需要引用当前共享库外部的地址指令,都会查询 GOT,来找到当前运行程序的虚拟内存里的对应位置。GOT 表里的数据是加载共享库时写进去的。

不修改代码,通过修改“地址数据”来进行关联